/*
获取当前目当录、更改当前目录、创建目录
获取当前进程已加载模块的文件的完整路径

GetCurrentDirectory、SetCurrentDirectory、CreateDirectory、GetModuleFileName函数
LoadLibrary函数；malloc、free函数
GetLastError函数
_tprintf函数
TEXT宏
*/
#include <windows.h>
#include <tchar.h>

void GetCurDir(void);
int SetCurDir(PCTSTR szFilePath);
void GetModName(HMODULE hModule);
void MakeDir(PCTSTR szFilePath);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    // 获取当前目录
    GetCurDir();

    // 更改进程的当前目录
    if (SetCurDir("d:\\")) {
        GetCurDir();
    }

    // 获取当前进程已加载模块的文件的完整路径
    GetModName(NULL);
    // 获取kernel32.dll的模块句柄
    // 获取当前进程已加载模块的文件的完整路径
    GetModName(LoadLibrary("kernel32.dll"));

    // 创建目录
    MakeDir("d:\\test");

    return 0;
}

/* 获取当前目录 */
void GetCurDir(void)
{
    DWORD dwBufferLength = GetCurrentDirectory(0, NULL);
    TCHAR *Buffer = (TCHAR *)malloc(dwBufferLength * sizeof(TCHAR));

    if ((GetCurrentDirectory(dwBufferLength, Buffer))!=0) {
        _tprintf(TEXT("当前目录： %s \n"), Buffer);
    } else {
        _tprintf(TEXT("获取当前目录出错。\n"));
    }

    free(Buffer);
}

/* 更改进程的当前目录 */
int SetCurDir(PCTSTR szFilePath)
{
    if (!(SetCurrentDirectory(szFilePath))) {
        _tprintf(TEXT("更改当前目录出错。\n"));
        return 0;
    } else {
        _tprintf(TEXT("已经把当前目录更改为： %s \n"), szFilePath);
    }

    return 1;
}

/* 创建目录 */
void MakeDir(PCTSTR szFilePath)
{
    if (CreateDirectory(szFilePath, NULL)!=0) {
        _tprintf(TEXT("已创建 %s 目录\n"), szFilePath);
    } else {
        DWORD dwError = GetLastError();
        if (dwError == ERROR_ALREADY_EXISTS) {
            _tprintf(TEXT("无法创建 %s 目录。目录已存在\n"), szFilePath);
        } else if (dwError == ERROR_PATH_NOT_FOUND) {
            _tprintf(TEXT("路径不存在，只创建路径中的最后一个目录。\n"));
        }
    }
}

/* 获取当前进程已加载模块的文件的完整路径 */
void GetModName(HMODULE hModule)
{
    TCHAR FileName[MAX_PATH];
    // 第三个参数要加上字符串结束空字符\0
    DWORD dwSize = GetModuleFileName(hModule, FileName, MAX_PATH);

    if (dwSize==0) {
        _tprintf(TEXT("获取模块路径出错。\n"));
    } else {
        _tprintf(TEXT("模块路径是： %s 。路径字符串总长度：%lu\n"), FileName, dwSize);
    }
}